变量是存储数据的容器,也可以理解为是一段命名的内存单元。
变量的作用域:过程级、模块级、工程级;
常量可以分为直接常量、符号常量、系统常量;
[Public | Private] Const 常量名 [As 数据类型]=常量表达式
系统常量,如vbRed,可以在代码窗口输入vba.vb,会有提示窗口;
定义变量除了可以使用Dim语句外,比较常的还有:static语句,Private语句,Public语句。使用不同的语句定义的变量不同的是它们的作用作用域不同,具体为:
Dim关键词表明了变量的声明。Dim是Dimension(维度)简称,历史要追溯到BASIC语言起源的20世纪60年代末。在当时的语言中,变量只是在需要的地方被用到,不需声明(数组除外)。数组在内存中的排布方式决定,在数组被使用前,BASIC语言编译器必须被告知数组的维度。这就是Dim声明的目的。现在,由于对所有变量都进行声明被认为是一个好习惯,Dim声明就被扩展到所有的变量声明了。
(1)如果在一个过程中包含了一个Dim或Static语句,此时声明的变量作用域为此过程,即本地变量。
(2)如果在一个模块的第一个过程之前包含了Dim或Prvate语句,此时声明的变量作用域为此模块里所有的过程,也就是在此模块里所有的过程都可以使用它,即模块作用域下的变量;
(3)如果在一个模块的第一个过程之前包含了Public语名,此时声明的变量作用域为所有模块,即公有变量。
变量的作用域是指变量保留其值的这段时间,也称为变量的生成周期,它决定变量可以用于哪个模块或过程中。
Const 常量名 As 数据类型 = 常量的值
Is 比较两个对象的引用变量|| 对象1 Is 对象2 || 当对象1和对象2引用相同的对象时返回True,否则返回False
Like 比较两个字符串是否匹配 || 字符串1 Like 字符串2 || 当字符串1与字符串2匹配时返回True,否则返回False
Range("A1") >= 500
Range("B2") Like "陈*"
"*"是通配符,代替任意多个字符
"?" 代替任意的单个字符
"#" 代替任意单个数字
[A-Z] 代替位于charlist中的任意一个字符
[!H-J] 代替不在charlist中的任意一个字符
VBA在循环中退出exit for
exit do
Sub 过程的参数有两种传递方式:按值传递(ByVal)和按地址传递(ByRef)。如下例:
Sub password (ByVal x as integer, ByRef y as integer)
Function password(ByVal x as integer, byref y as integer) as boolean
Office的方方面面都可以用VBA对象来描述。
对象变量
在使用对象模型的属性、方法和事件之前,必须创建一个对包含所需属性、方法和事件的类的引用。可以先声明一个局部对象变量以存储该对象引用,然后把对象引用赋给该局部变量。
声明对象变量的方法和声明其他类型的变量基本上一样。有三种声明对象变量的方法:
(1) Dim myObject As <库名>.<类名>
此方法指向类的类型库,但没有给该变量赋予任何类的实例。此时,变量myObject被赋值为Nothing。若要用这种方式引用类,就必须利用“引用”对话框向工程添加一个对类模块的引用。若要将类的实例引用赋予该变量,必须在使用该变量之前用Set语句赋值。如:
Set myObject=<库名>.<类名>
(2) Dim myObject As New <库名>.<类名>
此方法将类的新实例引用赋给Object变量。同样,要用这种方式引用类,必须先利用“引用”对话框向工程添加一个对类模块的引用。
(3) Dim myObject As Object
此方法将myObject变量声明为一般的Object数据类型,这在不能预先知道要创建的对象的数据类型时十分有用。此时,Object变量被赋值为Nothing。若要将对象引用赋值给该变量,必须使用CreateObject函数或GetObject函数。
可以用Private或Public语句替换Dim语句,且对象变量的作用域规则和其他类型的变量一样。
声明对象变量可以显著地简化代码且加快代码的执行速度。
Dim myRange As Object
上面的语句声明了一个叫做myRange的对象变量。然而,实际上只声明对象变量是不够的,在使用这个变量于程序里之前,你还给这个对象变量赋上确定的值。使用关键字Set来给对象变量赋值,关键字Set后面是等号,再后面是该变量指向的值,例如:
Set myRange = Worksheets("Sheet1").Range(Cells(1,1), Cells(10, 5))
使用明确的对象变量
对象变量可以引用任意一种对象,因为VB有很多种对象,所以,要让你的程序可读性更强,运行更快,最好创建引用到具体对象类型的对象变量。例如,在过程UseObjVariable中,你可以将myRange对象变量声明为Range对象,而不是通常的对象变量(Object):
Dim myRange As Range
如果你要引用一个具体的工作表,你可以声明Worksheet对象:
Dim mySheet As Worksheet
Set mySheet = Worksheets("Marketing")
当对象变量不再需要时,你可以给它赋值Nothing,这将释放内存和系统资源:
Set mySheet = Nothing
MsgBox函数会返回一个运行值,可以以此与用户交互。
myChoice = MsgBox(question, myButtons, myTitle)
town = InputBox(myPrompt, myTitle)
很多时候,你可能需要在Case子句里确定一个数值范围。可以通过关键字To用于表达式的数值之间来实现它,如下所示:
Select Case unitsSold Case 1 to 100 Discount = 0.05 Case Is <= 500 Discount = 0.1 Case 501 to 1000 Discount = 0.15 Case Is >1000 Discount = 0.2 End Select
“On Error Resume Next”语句在遇到错误发生时不会考虑错误,并继续执行下一条语句。
“On Error Goto 0”语句用于取消错误处理。
Dim myarr(5) As Integer
Dim myarr(1to5,1to10) As Integer
可以在运行时用ReDim语句重新指定数组的大小。
Dim arr(11) As Integer '11相当于数组上标Ubound
Dim arr2(1 To 11) As Integer '数组的长度:11-1
数组可以使用数组函数Array()赋值,如:
Dim arr3
arr3 = Array(1, 2, 3, 4, 5)
对于数组感兴趣的朋友在您掌握了一些基本的取值、赋值、循环等技巧之后,不妨在了解一些也许你们不太了解的数组用法,这些都会是很有用的数组编程技巧
1 取工作表区域的绝对引用公式到数组:arr=[a1:c5].Formula
2 取工作表区域的相对引用公式到数组:arr=[a1:c5].Formular1c1
3 取工作表区域的转置到数组:arr=Application.Transpose([a1:c5])
数组间也可以转置:arr1=Application.Transpose(arr)
4 取数组arr的第n列赋值到某列区域:[e1:e5]=Application.Index(arr, , n)
或者赋值产生一个新数组:arr1=Application.Index(arr, , n)
5 同理,取数组arr的第n行赋值到某行区域:[a6:c6]=Application.Index(arr,n , )
或者赋值产生一个新数组:arr1=Application.Index(arr, n, )
一些特殊字符不能写在双括号内,但VBA中没有转义字符,因此使用内置常量来表示;
如:VBA.Constants.vbTab就是表示一个制表符;
如果字符串分为多行,使用vbNewLine即可;
还可以利用ASCII来生成字符,如chr(i),可以把ASCII值i转换为字符,ASC(s)则可以把字符转换为数值;
如Chr(34)即表示是一个双引号;
日期和时间常量的两侧一般都写上#;
"vba" Like "vb?"
"vba" Like "v*"
"vb6" Like "vb#"
"vba" Like "[!abcde]ba"
VBA的控制结构不使用()和{},而是使用Wend、Loop、End If、End Select;
for和for each的next;
Application.Onkey "+e", "test" '当按下shift+e时,运行test过程
Application.OnTime Now() + TimeValue("01:00:00), "Test"